/****************************************************************************
                Университет:    Санкт-Петербургский Политехнический Университет
                Кафедра:        Компьютерные системы и программные технологии
                Аспирант:       Быков Илья Иванович
                Программа:      Расчет коэффициентов распределения
                Модуль:         resizenodecommand.cpp
                Назначение:
****************************************************************************/

#include <QDebug>

#include "movenodecommand.h"
#include "node.h"

/******************************************************************************
** MoveNodeCommand
*/

MoveNodeCommand::MoveNodeCommand(Document *doc, QList<Node*> nodeList, const QPointF &diffPos, bool final, QUndoCommand *parent)
    : Command(MoveNodeCommandId, doc, parent)
    , m_nodeList(nodeList)
    , m_diffPos(diffPos)
    , m_final(final)
{
    foreach (Node *node, m_nodeList) {
        m_oldPosList << node->pos();
    }
    if(m_nodeList.size() == 1) {
        setText(QString("Изменена позиция узла № %1").arg(QString::number(m_nodeList[0]->number())));
    } 
    else {
        setText(QString("Изменен позиция группы узлов"));
    }
}

void MoveNodeCommand::undo()
{
    for (int i = 0; i < m_nodeList.size(); i++) {
        m_nodeList[i]->setPos(m_nodeList[i]->pos() - m_diffPos);
    }
}

void MoveNodeCommand::redo()
{
    for (int i = 0; i < m_nodeList.size(); i++) {
        m_nodeList[i]->setPos(m_oldPosList[i] + m_diffPos);
    }
}

bool MoveNodeCommand::mergeWith(const QUndoCommand *command)
{
    if (m_final || command->id() != id())
        return false;

    const MoveNodeCommand *other = static_cast<const MoveNodeCommand*>(command);
    if (m_nodeList != other->m_nodeList)
        return false;

    m_diffPos = other->m_diffPos;
    m_final = other->m_final;
    redo();
    return true;
}
